using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._CartographyTools._GraphicConflicts
{
    /// <summary>
    /// <para>Propagate Displacement</para>
    /// <para>Propagates the displacement resulting from road adjustment in the Resolve Road Conflicts  and Merge Divided Roads tools to adjacent features to reestablish spatial relationships.</para>
    /// <para>将解决道路冲突和合并分割道路工具中的道路调整产生的位移传播到相邻要素，以重新建立空间关系。</para>
    /// </summary>    
    [DisplayName("Propagate Displacement")]
    public class PropagateDisplacement : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public PropagateDisplacement()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The input feature layer containing features that may be in conflict. May be point, line, or polygon.</para>
        /// <para>包含可能存在冲突的要素的输入要素图层。可以是点、线或多边形。</para>
        /// </param>
        /// <param name="_displacement_features">
        /// <para>Displacement Features</para>
        /// <para>The displacement polygon features created by the Resolve Road Conflicts or the Merge Divided Roads tools that contain the degree and direction of road displacement that took place. These polygons dictate the amount of displacement that will be propagated to the input features.</para>
        /// <para>由“解决道路冲突”或“合并分割道路”工具创建的位移面要素，其中包含发生的道路位移的程度和方向。这些面决定了将传播到输入要素的位移量。</para>
        /// </param>
        /// <param name="_adjustment_style">
        /// <para>Adjustment Style</para>
        /// <para><xdoc>
        ///   <para>Defines the type of adjustment that will be used when displacing input features.</para>
        ///   <bulletList>
        ///     <bullet_item>Automatic—The tool will decide for each input feature whether a SOLID or an ELASTIC adjustment is most appropriate. In general, features with orthogonal shapes will have SOLID adjustment applied, while organically shaped features will have ELASTIC adjustment applied. This is the default.</bullet_item><para/>
        ///     <bullet_item>Solid—The feature will be translated. All vertices will move the same distance and direction. Topological errors may be introduced. This option is most useful when input features have regular geometric shapes.</bullet_item><para/>
        ///     <bullet_item>Elastic—The vertices of the feature may be moved independently to best fit the feature to the road network. The shape of the feature may be modified slightly. Topological errors are less likely to be introduced. This option only applies to line and polygon input features. This option is most useful for organically shaped input features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>定义置换输入要素时将使用的调整类型。</para>
        ///   <bulletList>
        ///     <bullet_item>自动 - 该工具将针对每个输入特征决定 SOLID 或 ELASTIC 调整是否最合适。通常，具有正交形状的特征将应用 SOLID 调整，而有机形状的特征将应用 ELASTIC 调整。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>实体 - 将平移特征。所有顶点将以相同的距离和方向移动。可能会引入拓扑错误。当输入要素具有规则几何形状时，此选项最有用。</bullet_item><para/>
        ///     <bullet_item>弹性 - 要素的折点可以独立移动，以最佳方式将要素拟合到道路网络。特征的形状可能会略有修改。引入拓扑错误的可能性较小。此选项仅适用于线和面输入要素。此选项对于自然形状的输入要素最有用。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public PropagateDisplacement(object _in_features, object _displacement_features, _adjustment_style_value _adjustment_style)
        {
            this._in_features = _in_features;
            this._displacement_features = _displacement_features;
            this._adjustment_style = _adjustment_style;
        }
        public override string ToolboxName => "Cartography Tools";

        public override string ToolName => "Propagate Displacement";

        public override string CallName => "cartography.PropagateDisplacement";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_features, _displacement_features, _adjustment_style.GetGPValue(), _out_features];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input feature layer containing features that may be in conflict. May be point, line, or polygon.</para>
        /// <para>包含可能存在冲突的要素的输入要素图层。可以是点、线或多边形。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Displacement Features</para>
        /// <para>The displacement polygon features created by the Resolve Road Conflicts or the Merge Divided Roads tools that contain the degree and direction of road displacement that took place. These polygons dictate the amount of displacement that will be propagated to the input features.</para>
        /// <para>由“解决道路冲突”或“合并分割道路”工具创建的位移面要素，其中包含发生的道路位移的程度和方向。这些面决定了将传播到输入要素的位移量。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Displacement Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _displacement_features { get; set; }


        /// <summary>
        /// <para>Adjustment Style</para>
        /// <para><xdoc>
        ///   <para>Defines the type of adjustment that will be used when displacing input features.</para>
        ///   <bulletList>
        ///     <bullet_item>Automatic—The tool will decide for each input feature whether a SOLID or an ELASTIC adjustment is most appropriate. In general, features with orthogonal shapes will have SOLID adjustment applied, while organically shaped features will have ELASTIC adjustment applied. This is the default.</bullet_item><para/>
        ///     <bullet_item>Solid—The feature will be translated. All vertices will move the same distance and direction. Topological errors may be introduced. This option is most useful when input features have regular geometric shapes.</bullet_item><para/>
        ///     <bullet_item>Elastic—The vertices of the feature may be moved independently to best fit the feature to the road network. The shape of the feature may be modified slightly. Topological errors are less likely to be introduced. This option only applies to line and polygon input features. This option is most useful for organically shaped input features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>定义置换输入要素时将使用的调整类型。</para>
        ///   <bulletList>
        ///     <bullet_item>自动 - 该工具将针对每个输入特征决定 SOLID 或 ELASTIC 调整是否最合适。通常，具有正交形状的特征将应用 SOLID 调整，而有机形状的特征将应用 ELASTIC 调整。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>实体 - 将平移特征。所有顶点将以相同的距离和方向移动。可能会引入拓扑错误。当输入要素具有规则几何形状时，此选项最有用。</bullet_item><para/>
        ///     <bullet_item>弹性 - 要素的折点可以独立移动，以最佳方式将要素拟合到道路网络。特征的形状可能会略有修改。引入拓扑错误的可能性较小。此选项仅适用于线和面输入要素。此选项对于自然形状的输入要素最有用。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Adjustment Style")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _adjustment_style_value _adjustment_style { get; set; }

        public enum _adjustment_style_value
        {
            /// <summary>
            /// <para>Automatic</para>
            /// <para>Automatic—The tool will decide for each input feature whether a SOLID or an ELASTIC adjustment is most appropriate. In general, features with orthogonal shapes will have SOLID adjustment applied, while organically shaped features will have ELASTIC adjustment applied. This is the default.</para>
            /// <para>自动 - 该工具将针对每个输入特征决定 SOLID 或 ELASTIC 调整是否最合适。通常，具有正交形状的特征将应用 SOLID 调整，而有机形状的特征将应用 ELASTIC 调整。这是默认设置。</para>
            /// </summary>
            [Description("Automatic")]
            [GPEnumValue("AUTO")]
            _AUTO,

            /// <summary>
            /// <para>Solid</para>
            /// <para>Solid—The feature will be translated. All vertices will move the same distance and direction. Topological errors may be introduced. This option is most useful when input features have regular geometric shapes.</para>
            /// <para>实体 - 将平移特征。所有顶点将以相同的距离和方向移动。可能会引入拓扑错误。当输入要素具有规则几何形状时，此选项最有用。</para>
            /// </summary>
            [Description("Solid")]
            [GPEnumValue("SOLID")]
            _SOLID,

            /// <summary>
            /// <para>Elastic</para>
            /// <para>Elastic—The vertices of the feature may be moved independently to best fit the feature to the road network. The shape of the feature may be modified slightly. Topological errors are less likely to be introduced. This option only applies to line and polygon input features. This option is most useful for organically shaped input features.</para>
            /// <para>弹性 - 要素的折点可以独立移动，以最佳方式将要素拟合到道路网络。特征的形状可能会略有修改。引入拓扑错误的可能性较小。此选项仅适用于线和面输入要素。此选项对于自然形状的输入要素最有用。</para>
            /// </summary>
            [Description("Elastic")]
            [GPEnumValue("ELASTIC")]
            _ELASTIC,

        }

        /// <summary>
        /// <para>Output Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_features { get; set; }


        public PropagateDisplacement SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}